/**
 * 验证器，其包含多个元素的验证器
 */
var UpfValidator = function(formId){
	this.$form = $("#"+formId);
	this.velm = [];
};

UpfValidator.prototype = {
	//进行验证，如指定eid，则只验证指定的元素，不指定eid，则验证封装的所有元素。	
	valid : function(eid) {
		var result = true;
		//指定了具体的元素ID，则调用元素对象的验证方法，以验证指定的元素
		if(typeof(eid) !== 'undefined'){
			//alert('try valid '+eid);
			var a_elm = this.$form.data(eid);
			
			result = result && this.validElm(a_elm);
			
			return  result;
		}else{
		//没有指定ID，则验证所有的元素
			//循环调用各个元素验证对象的valid方法，进行验证。并返回true或false结果
			for (var index = 0; index < this.velm.length; index++){ 
				var elmId = this.velm[index];
				//alert("valid the elmid of "+elmId);
				var a_elm = this.$form.data(elmId);
				//alert("the valid object is "+a_elm);
				var er = this.validElm(a_elm);
				result = result && er;
				
			}
			return result ;
		}
		
	},
	validElm : function(a_elm) {
		//var result = false;
		var vr = a_elm.valid();
		//检查返回验证方法返回结果类型
		var vrType = typeof(vr);
		//如果返回类型为boolean
		if(vrType==='boolean'){
			//验证不通过，显示帮助信息
			if(!vr){
				a_elm.helpBlock.show();
			}else{
			    //验证通过，隐藏帮助信息	
				a_elm.helpBlock.hide();
			}
		//验证结果返回为字符，则表示验证不通过，且返回了提示信息	
		}else if(vrType==='string'){
			a_elm.helpBlock.empty(); ;
			a_elm.helpBlock.append(vr);
			a_elm.helpBlock.show();
		}
			
		
		return vr;
	},
	add :function(elm){
		var elmId = elm.$elm.attr('id');
		//alert('try add one element of id '+elmId);
		//添加指定的验证元素到data集合，将来可根据id取指定的对象
		this.$form.data(elmId,elm);


		//添加一个元素
		this.velm.push(elmId);
	},
	
	/**
	 * 重新设置要验证的元素集合，有些情况下要重置要验证的元素集合
	 * @param elmIds 数据，如["name","passwd"]
	 */
	resetElm : function(elmIds) {
		this.velm = elmIds;
	},
	/**
	 * 添加一个元素，使用数组的splice来实现
	 * @param elmId 要添加的元素ID
	 */
	addElm : function(elmId) {
		this.velm = this.velm.concat(elmId);
		//alert("after add is "+this.velm);
	},
	/**
	 * 删除一个元素，使用数组的splice来实现
	 * @param elmId 要删除的元素ID
	 */
	deleteElm : function(elmId) {
		for (var index = 0; index < this.velm.length; index++){ 
			var ei = this.velm[index];
			if(elmId === ei){
			//	alert("find the elm of "+ei);
				//var rmId = this.velm.splice(index, 1);
				this.velm.splice(index, 1);
			}
		}
		//alert("removed elm is  "+this.velm);
	}
};

/**
 * 单个元素验证器
 */
var ElementValidator = function(elm, options){
	this.$elm = $(elm);
	this.opts = $.extend({}, $.fn.uv.defaultSettings, options);
	
	//帮助提示内容，一般也是消息提示内容，一般为一个指定的DIV区域，如果不指定其ID，则默认为元素ID+HelpBlock
	this.helpBlock ;
	
	if(this.opts.helpBlockId){
		this.helpBlock = $("#"+this.opts.helpBlockId);
	}else{
		this.helpBlock = $("#"+this.$elm.attr("id")+"HelpBlock");
	}
	this.helpBlock.hide();
	
};

ElementValidator.prototype = {
	valid : function() {
		//调用 方法进行验证
		var m = this.opts.method;
		var arg = [];
		//arguments = Array.prototype.slice.call(this.opts.args, 0);
		for (var index = 0; index < this.opts.args.length; index++){ 
			arg.push(this.opts.args[index]);
		}
		//alert("arguments is "+arg);
		var r = m.apply(this,arg);

		//alert("the custome valid result is "+r);
		return r;
		//m(arguments);	
	}
};

(function($) {
	
	$.fn.uv = function(f,options) {
		var opts = $.extend({}, $.fn.uv.defaultSettings, options);
		return this.each(function() {
			var $this = $(this);
			//取默认的消息，如果没有，则取元素的title值
			var dm = opts.defaultMessage;
            opts.defaultMessage = typeof(dm) !== 'undefined' ? dm : $this.attr("title");
            $this.data('defaultMessage', opts.defaultMessage);
            //创建本元素的一个验证对象
            var ev = new ElementValidator($this, opts);
            f.add(ev);
            $this.blur(function(){setTimeout(
            		function() {f.valid($this.attr("id"));},300
            		);});
            
		});
	};
	
	//默认设置
	$.fn.uv.defaultSettings = {
		//默认的验证失败消息
		warmMessage : "无效的数值，请检查并重新填写",
		showTimeout: 100,
		css : 'has-success',
	    ecss : 'has-error',
	    glyphicon : 'glyphicon-ok',
		eglyphicon : 'glyphicon-remove',
		validStatus : '(success)',
		evalidStatus : '(error)'
	};
})(jQuery);